package cn.tedu.spotms.server.service.impl;

import cn.tedu.spotms.server.ex.ServiceException;
import cn.tedu.spotms.server.mapper.MerchantMapper;
import cn.tedu.spotms.server.pojo.dto.MerchantSimpleDTO;
import cn.tedu.spotms.server.pojo.entity.Merchant;
import cn.tedu.spotms.server.pojo.vo.MerchantSimpleVO;
import cn.tedu.spotms.server.service.IMerchantService;
import cn.tedu.spotms.server.web.State;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

@Slf4j
@Service
public class MerchantServiceImpl implements IMerchantService {

    @Autowired
    private MerchantMapper mapper;

    @Override
    public void addNewMerchant(MerchantSimpleDTO merchantSimpleDTO) {
        //根据name查询,该商户是否已经存在
        log.trace("根据用户输入信息,获取商户名字");
        String name = merchantSimpleDTO.getName();
        log.trace("查询商户名字"+name+"是否已经存在");
        //是:商户已存在,抛出异常
        if (mapper.getByName(name) != null) {
            log.trace("商户已经存在,抛出异常");
            throw new ServiceException(State.ERR_MERCHANT_NAME_DUPLICATE,"此商户已经存在...");
        }
        log.trace("类别不存在,准备向数据库中插入数据");
        //否:商户不存在,插入数据

        // 创建Merchant对象
        // 调用BeanUtils.copyProperties()将参数对象中的属性值复制到Merchant对象中,并补全相应数据
        Merchant merchant = new Merchant();
        BeanUtils.copyProperties(merchantSimpleDTO,merchant);

        //补全Merchant对象中的属性值：viewCount >>> 默认0
        merchant.setViewCount(0L);
        //补全Merchant对象中的属性值：gmtCreate/gmtModified >>> 默认当前系统时间
        LocalDateTime now = LocalDateTime.now();
        merchant.setGmtCreate(now);
        merchant.setGmtModified(now);
        mapper.insert(merchant);
    }

    @Override
    public MerchantSimpleVO getByName(String name) {
        log.trace("根据name调用mapper.getByName()查询");
        MerchantSimpleVO merchantSimpleVO = mapper.getByName(name);
        if (merchantSimpleVO == null){
            log.debug("查询到的数据为null,表示没有此商户信息,则抛出异常");
            throw new ServiceException(State.ERR_MERCHANT_NAME_NOT_FOUND,"查询的商户不存在...");
        }
        log.debug("查询到的数据不为null,表示查询到商户数据,并将数据返回");
        return merchantSimpleVO;
    }

    @Override
    public void updateByMerchantId(Long id, MerchantSimpleDTO merchantSimpleDTO) {
        //根据id查询是否有此商户
        MerchantSimpleVO merchantSimpleVO = mapper.getByMerchantId(id);
        if (merchantSimpleVO == null) {
            //没有:抛出异常,没有此商户
            log.debug("根据id没有查询到商户信息");
            throw new ServiceException(State.ERR_MERCHANT_NAME_NOT_FOUND,"商户不存在");
        }
        log.debug("走到此处,表明数据库中有该商户的信息,即将进行商户的修改");
        //有:修改数据
        mapper.updateByMerchantId(id,merchantSimpleDTO);
    }

    @Override
    public void deleteByMerchantId(Long id) {
        //根据id查询是否存在这个商户
        MerchantSimpleVO merchantSimpleVO = mapper.getByMerchantId(id);
        if (merchantSimpleVO == null) {
            //没有:抛出异常,没有此商户
            log.debug("根据id没有查询到商户信息");
            throw new ServiceException(State.ERR_MERCHANT_NAME_NOT_FOUND,"商户不存在");
        }
        //有,调用service中的删除方法
        log.debug("查到此商户,准备执行删除商户");
        mapper.deleteByMerchantId(id);
    }

    @Override
    public List<MerchantSimpleVO> getAllMerchant() {
        List<MerchantSimpleVO> list = mapper.getAllMerchant();
        return list;
    }
}
